"""
TODO 介绍

1、介绍：视图为一个虚拟表，根据SQL语句获取动态的数据集
       也就是，一个能够把复杂sql语句的功能封装起来的虚表，可读性+复用性
        只存放了视图的定义。没有存放视图中的数据，数据还在原来的表中

2、功能：简化代码，把查询封装成可重复使用的视图
        安全原因，可对不同的用户，设定不同的视图

TODO 创建视图

use test1;
create or replace view view1_emp
as
select ename,job from emp;

show tables;
show full tables;   -- 查看表的属性（view1_emp 为 view）

TODO 修改视图

alter view view_emp
as
select a.deptno,a.dname,b.ename, from dept a join emp b on a.deptno = b.deptno;  --select后只查询一个deptno，否则会报错重复列

TODO 更新视图

包含以下结构，不可查询：
  聚合函数：sum()、min()、max()、count()
  distinct
  group by
  having
  union 或 union all
  位于选择列表中的子查询
  join
  from子句中的不可更新视图
  where子句中的子查询，引用from子句中的表
  仅引用常量文字值

TODO 重命名和删除视图

rename table v1 to vv1;
drop view vv1;              --- 删除视图时，只会删除视图的定义，不会删除数据

TODO 综合练习

查询平均薪水最高的部门名称

select
 dname,
 loc,
 avg_sal,
 dept.deptno
from
dept ,
(
  select
  *
  from
 (
   select
   *,
   rank() over ( order by avg_sal desc ) rn
   from
     ( select deptno, avg( sal ) avg_sal from emp group by emp.deptno ) t
     ) tt
     where
     rn = 1
 ) ttt
   where
   ttt.deptno = dept.deptno;

查询员工比所属领导薪资高的部门名、员工名、员工领导编号
select
  a.ename ename,
  b.ename mname,
  a.sal esal,
  b.sal msal,
  a.deptno
from
  emp a,
  emp b
where a.mgr =b.empno and a.sal >b.sal

create view v_emp
as
select
  a.ename ename,
  b.ename mname,
  a.sal esal,
  b.sal msal,
  a.deptno
from
  emp a,
  emp b
where a.mgr =b.empno and a.sal >b.sal

select ename,mname,esal,msal,dname from v_emp,dept where v_emp.deptno = dept.deptno;

查询工资等级为4级，2000年以后入职，工作地点为北京的员工编号、姓名、工资，并查询薪资在前三名的员工信息
select * from emp join dept on emp.deptno = dept.deptno and year(hiredate)> '2000' and dept.loc = '北京'
                  join salg  on grade = 4 and emp.sal between salg.losal and salg.hisal

create view v_emp
as
select
  emp.ename,
  emp.sal,
  dept.deptno,
  dept.dname,
  dept.loc,
  salg.grade
from emp join dept on emp.deptno = dept.deptno and year(hiredate)> '2000' and dept.loc = '北京'
                  join salg  on grade = 4 and emp.sal between salg.losal and salg.hisal


select
*
from
(
select *,
rank()over(order by sal desc)  rn
from v_emp
)t
 where t.rn <= 3;
"""